package 正则表达式;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
在其他语言中，\\ 表示：我想要在正则表达式中插入一个普通的（字面上的）反斜杠，请不要给它任何特殊的意义。
在 Java 中，\\ 表示：我要插入一个正则表达式的反斜线，所以其后的字符具有特殊的意义。
--():标记子表达式开始和结束的位置，如果要匹配本身，使用\(和\)
--[]:用于确定中括号表达式的开始和结束的位置，如果要匹配本身，使用\[和\]
	如：[abc]表示匹配a、b、c中任一字符；[a-f]表示匹配a~f之间任一字符；[a-z&&[def]]是a~z和[def]之间的交集，表示d、e、f
--{}:用于前面表达式的出现频度
--指定字符
	如：正则表达式A只能匹配A
--指定Unicode字符 \ u
	如：正则表达式\u548c,可以匹配汉字：和
--转义：\ 将下一个字符标记为特殊字符、文本、反向引用或八进制转义符
	如：正则表达式a\&c，其中\&是用来匹配特殊字符&的，它能精确匹配字符串"a&c"，但不能匹配"ac"、"a-c"、"a&&c"等。
--匹配一个任意字符： .
	如：正则表达式a.c中间的.可以匹配一个任意字符。 abc、a&c、acc都可匹配
--匹配数字(0..9)：\d 
	如：正则表达式00\d可以匹配 007或008
--匹配常用字符： \w  可以匹配一个字母、数字或下划线，a~z，A~Z，0~9，_ w的意思是word。它不能匹配"java#"，"java "，因为\w不能匹配#、空格等字符。
	如：java\w可以匹配：javac、java9、java_
--匹配非常用字符: \W 可以匹配：&，@，中，……
--匹配空格字符: \s 可以匹配一个空格字符，注意空格字符不但包括空格，还包括tab字符（在Java中用\t表示）
	如：a\sc可以匹配：a c
--匹配非空格字符： \S 可以匹配：a，A，&，_，……
--匹配非数字：\D   用\d可以匹配一个数字，而\D则匹配一个非数字。
	如：00\D可以匹配：00A、00#
--重复匹配：
	---修饰符*可以匹配任意个字符，包括0个字符
		如：用A\d*可以匹配：A、A0、A380
	---修饰符+可以匹配至少一个字符。
		如：用A\d+可以匹配：A0、A380,它无法匹配"A"，因为修饰符+要求至少一个字符。
	---修饰符?可以匹配0个或一个字符
		如：用A\d?可以匹配：A、A0,但它无法匹配"A33"，因为修饰符?超过1个字符就不能匹配了。
	---修饰符{n,m}匹配n~m个字符
		如：A\d{3,5}可以精确匹配：A380、A3800、A38000  如果没有上限，那么修饰符{n,}就可以匹配至少n个字符。
--匹配开头和结尾：用正则表达式进行多行匹配时，我们用^表示开头，$表示结尾。
	如：^A\d{3}$，可以匹配"A001"、"A380"。
--匹配指定范围：使用[...]可以匹配范围内的字符
	如：[123456789]可以匹配1~9。如果我们规定一个7~8位数字的电话号码不能以0开头，则写出上述电话号码的规则：[123456789]\d{6,7}。
	把所有字符全列出来太麻烦，[...]还有一种写法，直接写[1-9]就可以
	要匹配大小写不限的十六进制数，比如1A2b3c，我们可以这样写：[0-9a-fA-F]
	[...]还有一种排除法，即不包含指定范围的字符。假设我们要匹配任意字符，但不包括数字，可以写[^1-9]{3}：
		可以匹配"ABC"，因为不包含字符1~9；
		可以匹配"A00"，因为不包含字符1~9；
		不能匹配"A01"，因为包含字符1；
		不能匹配"A05"，因为包含字符5。
--或规则匹配：用|连接的两个正则规则是或规则
	如：AB|CD表示可以匹配AB或CD。
--p{n}:n是非负数，正好匹配n次
	如：o{2}匹配food中的两个o
--p{n,}:n是非负数，至少匹配n次
	如：o{2}匹配foood中的所有o
--p{n,m}:n,m是非负数，n<m,至少匹配n次，最多匹配m次
	如：o{1,3}匹配foooood中的三个o
--\p{P}
--\b:匹配一个字边界
	如：va\b匹配java中的va,但不匹配javac中的va
--\B:非字边界匹配
--使用括号：我们想要匹配字符串learn java、learn php和learn go怎么办？一个最简单的规则
	是learn\sjava|learn\sphp|learn\sgo，但是这个规则太复杂了，可以把公共部分提出来，然后用(...)把子规则括起来表
	示成learn\\s(java|php|go)。
--分组匹配：(...)还有一个重要作用，就是分组匹配。引入java.util.regex包，用Pattern对象匹配，匹配后获得一个Matcher对象，如果匹配
	成功，就可以直接从Matcher.group(index)返回子串：
	如：(\\d{4})-((\\d{2})-(\\d{2}))  匹配 2017-04-25，分组情况：
	group(0):2017-04-25
	group(1):2017
	group(2):04-25
	group(3):04
	group(4):25
--命名捕获组：(?<name>pattern)
	如：(?<year>\\d{4})-(?<md>(?<month>\\d{2})-(?<date>\\d{2}))
	group(0):2017-04-25
	year:2017
	md:04-25
	month:04
	date:25
	
--Pattern：pattern 对象是一个正则表达式的编译表示。创建出一个Pattern对象，然后反复使用，就可以实现编译一次，多次匹配：
--Matcher:Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样，Matcher 也没有公共构造方法。你需要调
	用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
--区分大小写：java默认是区分大小写，要实现不区分大小写：
	如：(?i)abc表示abc都不区分大小写；a(?i)bc,表示bc不区分大小写；a((?i(b))c,表示只有b不区分大小写
*/

public class 使用正则表达式 {
	public static void main(String[] args) {
		String re1 = "java\\d"; // 对应的正则是java\d
		System.out.println("java9".matches(re1));
		System.out.println("java10".matches(re1));	
		System.out.println("javac".matches(re1));

		String re2 = "java\\D";
		System.out.println("javax".matches(re2));
		System.out.println("java#".matches(re2));
		System.out.println("java5".matches(re2));
		
      Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");//("(\\d{3,4})\\-(\\d{7,8})")
      pattern.matcher("010-12345678").matches(); // true
      pattern.matcher("021-123456").matches(); // false
      pattern.matcher("022#1234567").matches(); // false
      // 获得Matcher对象:
      Matcher matcher = pattern.matcher("010-12345678");
      if (matcher.matches()) {
          String whole = matcher.group(0); // "010-12345678", 0表示匹配的整个字符串
          String area = matcher.group(1); // "010", 1表示匹配的第1个子串
          String tel = matcher.group(2); // "12345678", 2表示匹配的第2个子串
          System.out.println(whole);
          System.out.println(area);
          System.out.println(tel);
      }
	}
}

/*
public class 使用正则表达式{
   public static void main( String[] args ){

     // 按指定模式在字符串查找
     String line = "This order was placed for QT3000! OK?";
     String pattern = "(\\D*)(\\d+)(.*)";

     // 创建 Pattern 对象
     Pattern r = Pattern.compile(pattern);

     // 现在创建 matcher 对象
     Matcher m = r.matcher(line);
     if (m.find( )) {
        System.out.println("Found value: " + m.group(0) );
        System.out.println("Found value: " + m.group(1) );
        System.out.println("Found value: " + m.group(2) );
        System.out.println("Found value: " + m.group(3) ); 
     } else {
        System.out.println("NO MATCH");
     }
  }
}
*/